#ifndef SUNPOSITION_H
#define SUNPOSITION_H

#include <utility>

/**
 * @class SunPosition
 * @brief 计算太阳位置的类
 *
 * 提供了计算太阳位置（高度角和方位角）的方法。
 * 包含用于计算太阳位置的私有辅助函数。
 */
class SunPosition
{
public:
    /**
     * @brief 计算太阳位置
     *
     * 根据给定的经纬度、日期和时间计算太阳的高度角和方位角。
     *
     * @param longitude 经度，以度为单位
     * @param latitude 纬度，以度为单位
     * @param year 年份
     * @param month 月份（1 到 12）
     * @param day 日（1 到 31）
     * @param hour 小时（0 到 23）
     * @param minute 分钟（0 到 59）
     * @param second 秒（0 到 59）
     * @return 一个包含两个 double 值的 pair，第一个值是太阳的高度角，第二个值是太阳的方位角
     */
    static std::pair<double, double> calculateSunPosition(double longitude, double latitude, int year, int month, int day, int hour, int minute, int second);

private:
    /**
     * @brief 计算正弦函数，结果保留指定精度
     *
     * 计算正弦值，并将结果保留到指定的小数位数。
     *
     * @param sin 输入值，以弧度为单位
     * @param precision 精度，即小数位数
     * @return 计算得到的正弦值
     */
    static double MathSin(double sin, int precision = 5);

    /**
     * @brief 计算余弦函数，结果保留指定精度
     *
     * 计算余弦值，并将结果保留到指定的小数位数。
     *
     * @param cos 输入值，以弧度为单位
     * @param precision 精度，即小数位数
     * @return 计算得到的余弦值
     */
    static double MathCos(double cos, int precision = 5);

    /**
     * @brief 计算时区
     *
     * 根据给定的经度计算时区。
     *
     * @param longitude 经度，以度为单位
     * @return 计算得到的时区
     */
    static int calculateTimeZone(double longitude);
};

#endif // SUNPOSITION_H
